package donkeykong;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Ascensor extends JPanel implements Runnable {
	

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/** Imagene del sprite del ascensor**/
	private Image imagenAscensor;
	/** MOVIMIENTO DEL MUELLE, UNIDAD!=0 MUELLE HACE SU MOVIMIENTO, UNIDAD=0, MARIO HA MUERTO **/
	private int UNIDAD = 1;
	/** Variable que indica que este muelle debe sacarse de la lista de muelles activos en la pantalla **/
	private boolean destruir;
	/** Posicion X del muelle **/
	private int posicionX_ascensor;
	/** Posicion Y del muelle **/
	private int posicionY_ascensor;
	/** tipo de ascensor: Para saber si son de los que suben o los que bajan **/
	private int tipoAscensor;

	
	private Mario mario;
	private boolean en_ascensor_1;
	private boolean en_ascensor_2;
	
	public Ascensor (int posx, int posy, Mario m, int tipo){
		try {
			setPosicionX(posx);
			setPosicionY(posy);
			setEn_ascensor_1(false);
			setEn_ascensor_2(false);
			
			tipoAscensor = tipo;
			mario = m;
			destruir=false;
			imagenAscensor = ImageIO.read(new File("./images/ascensor/ascensor_nivel_2_modificado.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/** Funcion paintComponent que es propia de los JPanels, que sirve para dibujar en el mismo la imagen que se quiera, entre otras opciones **/
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		/** Para hacer operaciones complejas con una imagen, crear un AffineTransform **/
		AffineTransform at = new AffineTransform();
		
		/** Si UNIDAD=0, significa que mario ha muerto, y el muelle ha de quedarse en la ultima posicion y con el ultimo sprite valido **/
		if (UNIDAD!=0){
			
			
			
			
		}
		at.translate(getPosicionX(), getPosicionY()- imagenAscensor.getHeight(null)); 

		g2d.drawImage(imagenAscensor,at,null);
	}
	
	
	
	/** Funcion que sirve para comprobar si el barril choca con Mario **/
	private void comprobarChoque() {
		/** Punto central del barril **/
		int posicion_centro_x = getPosicionX()+ imagenAscensor.getWidth(null)/2 ;
		int posicion_centro_y = getPosicionY()- imagenAscensor.getHeight(null) ;
		
		/** Esquinas de la imagen de Mario **/
		int mario_x_final = mario.getPosicion_x()+mario.getImage().getWidth(null);
		int mario_x_inicial = mario.getPosicion_x();
		int mario_y_final = mario.getPosicion_y()-5;
		
		
		if (posicion_centro_x <= mario_x_final & posicion_centro_x >= mario_x_inicial){
			if (Math.abs(posicion_centro_y - mario_y_final) < 10	){
				mario.setPosicion_y(posicion_centro_y);
				mario.setSaltando(false);
				mario.setIncrementoSalto(0);
				mario.setDesplazamientoSalto(0);
				if (tipoAscensor==1){
					mario.setPosicion_y(mario.getPosicion_y()+1);
					setEn_ascensor_1(true);
					setEn_ascensor_2(false);
				
				}else if (tipoAscensor==2){
					setEn_ascensor_1(false);
					setEn_ascensor_2(true);	

				}
			}else {
			}
		}

		
	}
	
	
	
	/** Funcion para modificar la posicion X del muelle **/
	private void setPosicionX(int posx) {
		posicionX_ascensor = posx;
	}

	/** Funcion para modificar la posicion Y del muelle **/
	private void setPosicionY(int posy) {
		posicionY_ascensor = posy;
	}
	
	/** 
	 * Devuelve el valor de la posicion Y del muelle 
	 * @return valor de la posicion Y del muelle 
	 */
	public int getPosicionY() {
		return posicionY_ascensor;
	}
	
	/** 
	 * Devuelve el valor de la posicion X del muelle 
	 * @return valor de la posicion X del muelle 
	 */ 
	private int getPosicionX() {
		return posicionX_ascensor;
	}
	
	/** Funcion que modifica el valor de UNIDAD a 0 para indicar que Mario ha muerto **/
	public void MarioMuerto(){
		UNIDAD = 0;
	}
	
	/** Funcion que marca el muelle para ser destruido **/
	private void destruirAscensor() {
		destruir = true;
	}
	
	/**
	 * Funcion que comprueba si el muelle debe ser destruido 
	 * @return cierto si el muelle debe ser destruido, falso en caso contrario
	 */
	public boolean isAcabado() {
		return destruir;
	}
	

	@Override
	public void run() {
		// TODO Auto-generated method stub
	try {
		if (tipoAscensor == 1){

			if (!mario.isMuriendo()){
				while (getPosicionY() > 230){
					
					if( (mario.getPosicion_y()>240) & (mario.getCentroMario()<145 | mario.getCentroMario()>187) ){
						setEn_ascensor_1(false);
						//System.out.println("SALIENDO ZONA ASCENSORES IZQUIERDA");
						
					}
					
					Thread.sleep(102);
					for(int i=1;i<=3;i++){
						if (isEn_ascensor_1()) {
							setPosicionY(getPosicionY()-1);
							mario.setPosicion_y(mario.getPosicion_y()-1);
							
							if (mario.getPosicion_y()<220){
								 mario.isMuriendo();
								 mario.Muriendo();
							 }
						//comprobarChoque();
						}else{
							setPosicionY(getPosicionY()-1);
							comprobarChoque();				
						}

					}
				}
			}
		}else /** tipoAscensor == 2 **/ {

			if (!mario.isMuriendo()){
				while (getPosicionY() < 600){
					
					if( (mario.getPosicion_y()>240) & (mario.getCentroMario()<338 | mario.getCentroMario()>380) ){
						setEn_ascensor_2(false);
						//System.out.println("SALIENDO ZONA ASCENSORES DERECHA");
						
					}
					
					Thread.sleep(102);
					for(int i=1;i<=3;i++){
						if (isEn_ascensor_2()) {
							setPosicionY(getPosicionY()+1);
							mario.setPosicion_y(mario.getPosicion_y()+1);
							 if (mario.getPosicion_y()<220){
								 mario.isMuriendo();
								 mario.Muriendo();
							 }
							 //comprobarChoque();
						}else{
							setPosicionY(getPosicionY()+1);
							comprobarChoque();
						}
					}
				}
			}
		}
	
		destruirAscensor();
		
	}catch(Exception e){
		
	}
	
	}

	public boolean isEn_ascensor_1() {
		return en_ascensor_1;
	}

	public void setEn_ascensor_1(boolean en_ascensor_1) {
		this.en_ascensor_1 = en_ascensor_1;
	}

	public boolean isEn_ascensor_2() {
		return en_ascensor_2;
	}

	public void setEn_ascensor_2(boolean en_ascensor_2) {
		this.en_ascensor_2 = en_ascensor_2;
	}

	public Image getImage() {
		return imagenAscensor;
	}
		
		
		
	

}

